package v1

import (
	"ginblog/model"
	"ginblog/utils/errormsg"
	"github.com/gin-gonic/gin"
	"net/http"
	"strconv"
)

// 添加分类
func AddCategory(c *gin.Context) {
	// 添加分类
	var data model.Category
	// 将该请求获取的值 根据json 传给对应的 data 中的字段
	_ = c.ShouldBindJSON(&data)
	// 判断分类是否已经存在
	code := model.CheckCategory(data.Name)
	// 返回success 则代表不存在 则可以创建
	if code == errormsg.SUCCESS {
		// 这里调用创建用户的方法
		model.CreateCategory(&data)
	}
	// 如果已经存在 code设为对应的错误码
	if code == errormsg.ERROR_CATENAME_USED {
		code = errormsg.ERROR_CATENAME_USED
	}
	// 返回json格式的数据 gin.H是一个哈希表 返回对应的状态码 数据 和 提示
	c.JSON(http.StatusOK, gin.H{
		"status":  code,
		"data":    data,
		"message": errormsg.GetErrorMsg(code),
	})
}

// 查询分类列表
func GetCategories(c *gin.Context) {
	// 分页查询 获取每页的数量和页数
	pageSize, _ := strconv.Atoi(c.Query("pagesize"))
	pageNum, _ := strconv.Atoi(c.Query("pagenum"))
	// 如果是0 则不需分页限制 设置pageSize为-1
	switch  {
	case pageSize >= 100:
		pageSize = 100
	case pageSize <= 0:
		pageSize = 0
	}
	// 如果是0 则不需分页限制 设置pageNum为-1
	if pageNum == 0 {
		pageNum = 1
	}
	// 得到对应的数据
	data, total := model.GetCategories(pageSize, pageNum)
	// 获取对应的状态码
	code := errormsg.SUCCESS
	// 返回json格式的数据
	c.JSON(http.StatusOK, gin.H{
		"status":  code,
		"data":    data,
		"total" : total,
		"message": errormsg.GetErrorMsg(code),
	})
}

// 查询单个分类信息
func GetCateInfo(c *gin.Context) {
	id, _ := strconv.Atoi(c.Param("id"))
	data, code := model.GetCateInfo(id)
	c.JSON(http.StatusOK, gin.H{
		"status":  code,
		"data":    data,
		"message": errormsg.GetErrorMsg(code),
	})
}

// 编辑分类名
func EditCategory(c *gin.Context) {
	// 获取前端传过来的 id和user结构体
	var data model.Category
	id, _ := strconv.Atoi(c.Param("id"))
	_ = c.ShouldBindJSON(&data)
	// 检查更新的用户名是否存在 如果存在 不能更改
	code := model.CheckCategory(data.Name)
	if code == errormsg.SUCCESS {
		model.EditCategory(id, &data)
	}
	// 禁止执行
	if code == errormsg.ERROR {
		c.Abort()
	}
	c.JSON(http.StatusOK, gin.H{
		"status":  code,
		"message": errormsg.GetErrorMsg(code),
	})
}

// 删除分类
func DeleteCategory(c *gin.Context) {
	id, _ := strconv.Atoi(c.Param("id"))
	code := model.DeleteCategory(id)
	c.JSON(http.StatusOK, gin.H{
		"status":  code,
		"message": errormsg.GetErrorMsg(code),
	})
}
